package resource

import (
	"gitee.com/hexug/go-tools/logger"
	appsv1 "k8s.io/api/apps/v1"
	corev1 "k8s.io/api/core/v1"
	"strings"
)

// RemoveEmptyLines 移除字符串中的空行
func RemoveEmptyLines(namespace, name, key, input, workloadType, workloadName string) string {
	// 1. 按换行符分割为行切片（支持 \n 或 \r\n，因为后续 TrimSpace 会处理 \r）
	lines := strings.Split(input, "\n")

	// 2. 过滤空格行：收集 TrimSpace 后非空的行
	var validLines []string
	for i, line := range lines {
		// TrimSpace：去除行首尾的所有空白字符（空格、\t、\r 等）
		trimmedRight := strings.TrimRight(line, " \t\r")
		// 如果有行尾空格被去掉，打印日志
		if len(trimmedRight) < len(line) && strings.TrimSpace(trimmedRight) != "" {
			logger.L().WarnWithIconf(`
[ConfigMap行尾空格警告]
  Namespace    : %s
  WorkloadType : %s
  WorkloadName : %s
  ConfigMap    : %s
  Key          : %s
  Line         : %d
  Content      : %q`,
				namespace, workloadType, workloadName, name, key, i+1, line)
		}
		if strings.TrimSpace(trimmedRight) != "" { // 非空格行则保留
			validLines = append(validLines, line) // 注意：保留原始行（仅过滤，不修改内容）
			// 若需同时去除行首尾空白，可改为 validLines = append(validLines, trimmedLine)
		}
	}

	// 3. 用 \n 拼接有效行，恢复多行格式
	return strings.Join(validLines, "\n")
}

// ExtractConfigMapNames 从 Deployment 解析出关联的 configmap 名称
func ExtractConfigMapNames(dep *appsv1.Deployment) []string {
	set := make(map[string]struct{})

	// volumes
	for _, v := range dep.Spec.Template.Spec.Volumes {
		if v.ConfigMap != nil {
			set[v.ConfigMap.Name] = struct{}{}
		}
	}

	// envFrom + env
	for _, c := range dep.Spec.Template.Spec.Containers {
		for _, e := range c.EnvFrom {
			if e.ConfigMapRef != nil {
				set[e.ConfigMapRef.Name] = struct{}{}
			}
		}
		for _, e := range c.Env {
			if e.ValueFrom != nil && e.ValueFrom.ConfigMapKeyRef != nil {
				set[e.ValueFrom.ConfigMapKeyRef.Name] = struct{}{}
			}
		}
	}

	// 转为 slice
	var names []string
	for k := range set {
		names = append(names, k)
	}
	return names
}

func ExtractConfigMapNamesFromPodSpec(podSpec *corev1.PodSpec) []string {
	names := make(map[string]struct{})

	// 1. Volume 引用的 ConfigMap
	for _, vol := range podSpec.Volumes {
		if vol.ConfigMap != nil {
			names[vol.ConfigMap.Name] = struct{}{}
		}
	}

	// 2. EnvFrom 引用的 ConfigMap
	for _, c := range podSpec.Containers {
		for _, envFrom := range c.EnvFrom {
			if envFrom.ConfigMapRef != nil && envFrom.ConfigMapRef.Name != "" {
				names[envFrom.ConfigMapRef.Name] = struct{}{}
			}
		}
		// 3. 单个 Env Key 来自 ConfigMap
		for _, env := range c.Env {
			if env.ValueFrom != nil && env.ValueFrom.ConfigMapKeyRef != nil {
				names[env.ValueFrom.ConfigMapKeyRef.Name] = struct{}{}
			}
		}
	}

	// 转换为 slice
	result := []string{}
	for n := range names {
		result = append(result, n)
	}
	return result
}

func ExtractSecretNamesFromPodSpec(podSpec *corev1.PodSpec) []string {
	names := make(map[string]struct{})

	// 1. Volume 引用的 Secret
	for _, vol := range podSpec.Volumes {
		if vol.Secret != nil && vol.Secret.SecretName != "" {
			names[vol.Secret.SecretName] = struct{}{}
		}
	}

	// 2. EnvFrom Secret
	for _, c := range podSpec.Containers {
		for _, envFrom := range c.EnvFrom {
			if envFrom.SecretRef != nil && envFrom.SecretRef.Name != "" {
				names[envFrom.SecretRef.Name] = struct{}{}
			}
		}
		// 3. Env.ValueFrom SecretKeyRef
		for _, env := range c.Env {
			if env.ValueFrom != nil && env.ValueFrom.SecretKeyRef != nil {
				if env.ValueFrom.SecretKeyRef.Name != "" {
					names[env.ValueFrom.SecretKeyRef.Name] = struct{}{}
				}
			}
		}
	}

	// 4. ImagePullSecrets
	for _, ips := range podSpec.ImagePullSecrets {
		if ips.Name != "" {
			names[ips.Name] = struct{}{}
		}
	}

	result := []string{}
	for n := range names {
		result = append(result, n)
	}
	return result
}
